package com.lu.manage.core.common.node;
import com.lu.manage.core.common.constant.SystemConstant;
import com.lu.manage.modular.system.model.Dept;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.*;

/**
 * @program LuBoot
 * @description: layuiTree
 * @author: zhanglu
 * @create: 2019-11-07 20:59:00
 */
@Data
@Accessors(chain = true)
public class LayuiTreeNode {

    private String id;
    //一般对应表字段名
    private String field;
    //节点标题
    private String title;
    //点击节点弹出新窗口对应的 url。需开启 isJump 参数
    private String href;
    //节点是否初始展开，默认 false
    private boolean spread;
    //节点是否初始为选中状态（如果开启复选框的话），默认 false
    private boolean checked;
    //节点是否为禁用状态。默认 false
    private boolean disabled;
    //子节点。支持设定选项同父节点
    private List<LayuiTreeNode> children;

    //pid
    private String pid;
    //层级
    private Integer level;
    //数据对象
    private Object data;

    /**
     * 将部门数据转换成layuiTree格式数据结构
     * @param deptList
     * @return
     */
    public List<LayuiTreeNode> convertDept(List<Dept> deptList){
        List<LayuiTreeNode> nodeList = new LinkedList<>();

        for (Dept dept : deptList) {
            LayuiTreeNode node = new LayuiTreeNode();
            node.setId(dept.getId());
            node.setPid(dept.getPid());
            node.setTitle(dept.getSimpleName());
            node.setLevel(dept.getLevel());
            node.setData(dept);
            nodeList.add(node);
        }
        return nodeList;
    }

    /**
     * 递归计算父子树
     * @param nodeList
     * @param rank
     * @param listMap
     * @return
     */
    public List<LayuiTreeNode> nodeList(List<LayuiTreeNode> nodeList, Integer rank, Map<String, List<LayuiTreeNode>> listMap) {

        int n;

        Map<String, List<LayuiTreeNode>> currentMap = new HashMap<>();

        for (n = nodeList.size() - 1; n >=0 && nodeList.get(n).getLevel() == rank ; n--) {

            //每个父亲找到上一次迭代的孩子们
            if(listMap != null && listMap.containsKey(nodeList.get(n).getId())){
                if(rank == 1){
                    nodeList.get(n).setSpread(true);
                }
                nodeList.get(n).setChildren(listMap.get(nodeList.get(n).getId()));
            }
            //一个父亲下的孩子相认
            if(nodeList.get(n).getPid() != null && !nodeList.get(n).getPid().equals(SystemConstant.pid)){
                //当前元素的pid在map中是否存在，如果不存在则开辟一个空间，以待 将来 孩子相认 有个存储空间
                currentMap.computeIfAbsent(nodeList.get(n).getPid(), k -> new LinkedList<>());
                //把当前元素放到新开辟或者已经开辟了的空间中
                currentMap.get(nodeList.get(n).getPid()).add(0, nodeList.get(n));
            }
        }

        if(n < 0){
            LayuiTreeNode node = new LayuiTreeNode();
            node.setId(SystemConstant.pid);
            node.setTitle("顶级");
            node.setSpread(true);
            node.setChildren(nodeList);
            return Arrays.asList(node);
        }else {
            return nodeList(new ArrayList<>(nodeList.subList(0, n + 1)), nodeList.get(n).getLevel(), currentMap);
        }

    }


}
